package com.caunock.sqlbuilder.adapter;

import com.caunock.sqlbuilder.meta.Column;
import com.caunock.sqlbuilder.meta.Index;
import com.caunock.sqlbuilder.meta.Table;

/**
 * 驱动适配器
 * @author 秦先生
 */
public interface DDLAdapter {

    /**
     * 占位符
     */
    String BR_TAB = "\n\t";
    String BR = "\n";

    /* *****************************************************************************************************************
     *
     * 													db
     *
     ******************************************************************************************************************/
    /**
     * 获取数据库列表
     *
     * @return 数据库列表sql
     */
    String listDatabases();

    /**
     * 获取表列表
     *
     * @return 获取表列表sql
     */
    String listTables(String schema);

    /* *****************************************************************************************************************
     *
     * 													table
     *
     ******************************************************************************************************************/

    /**
     * 构建表创建
     * @param builder 容器
     * @param meta 表是否存在
     * @return 容器
     */
    StringBuilder buildCreate(StringBuilder builder, Table meta);

    /**
     * 检查表是否存在
     * @param builder 容器
     * @param exists 表是否存在
     * @return 容器
     */
    StringBuilder checkTableExists(StringBuilder builder, boolean exists);

    /**
     * 构造表名
     * @param builder 容器
     * @param meta 表单元数据
     * @return 容器
     */
    StringBuilder tableName(StringBuilder builder, Table meta);

    /**
     * 构造表body部分，包含index
     * @param builder 容器
     * @param meta 表单元数据
     * @return 容器
     */
    StringBuilder body(StringBuilder builder, Table meta);


    /**
     * 构造表注释
     * @param builder 容器
     * @param meta 表元数据
     * @return 容器
     */
    StringBuilder comment(StringBuilder builder, Table meta);


    /* *****************************************************************************************************************
     *
     * 													column
     *
     ******************************************************************************************************************/

    /**
     * 创建列
     * @param builder builder
     * @param meta 表元数据
     * @return StringBuilder
     */
    StringBuilder columns(StringBuilder builder, Table meta);


    /**
     * 定义单列
     * @param builder builder
     * @param meta 列元数据
     * @return StringBuilder
     */
    StringBuilder columnDefine(StringBuilder builder, Column<?> meta);

    /**
     * 列类型定义
     * @param builder builder
     * @param column 列
     * @return StringBuilder
     */
    StringBuilder type(StringBuilder builder, Column<?> column);

    /**
     * 描述定义
     * @param builder builder
     * @param column 列元数据
     * @return StringBuilder
     */
    StringBuilder comment(StringBuilder builder, Column<?> column);

    /**
     * 允许为空定义
     * @param builder builder
     * @param meta 列元数据
     * @return StringBuilder
     */
    StringBuilder nullable(StringBuilder builder, Column<?> meta);

    /**
     * 默认值定义
     * @param builder builder
     * @param meta 列元数据
     * @return StringBuilder
     */
    StringBuilder defaultValue(StringBuilder builder, Column<?> meta);


    /* *****************************************************************************************************************
     *
     * 													extra
     *
     ******************************************************************************************************************/

    /**
     * 主键定义
     * @param builder builder
     * @param meta 表元数据
     * @return StringBuilder
     */
    StringBuilder primary(StringBuilder builder, Table meta);

    /**
     * 自增定义，需要通过serial实现的话，必须在以下方法中实现
     * {@link DDLAdapter#type(StringBuilder, Column)}
     * @param builder builder
     * @param meta 字段元数据
     * @return StringBuilder
     */
    StringBuilder increment(StringBuilder builder, Column<?> meta);

    /**
     * 索引定义
     * @param builder builder
     * @param meta 表元数据
     * @return StringBuilder
     */
    StringBuilder indexes(StringBuilder builder, Table meta);

    /**
     * 索引定义
     * @param builder builder
     * @param meta 索引元数据
     * @return StringBuilder
     */
    StringBuilder indexes(StringBuilder builder, Index meta, String tableName);

    /**
     * 追加表注释，{@link DDLAdapter#comment(StringBuilder, Table)}二选一
     * @param builder builder
     * @param meta 表元数据
     * @return StringBuilder
     */
    StringBuilder tableCommentOn(StringBuilder builder, Table meta);

    /**
     * 追加字段注释，{@link DDLAdapter#comment(StringBuilder, Column)}二选一
     * @param builder builder
     * @param meta 表元数据
     * @return StringBuilder
     */
    StringBuilder columnCommentOn(StringBuilder builder, Table meta);

    /**
     * 追加索引注释
     * @param builder builder
     * @param meta 表元数据
     * @return StringBuilder
     */
    StringBuilder indexCommentOn(StringBuilder builder, Index meta);
}
